package pers.cz.netty.util;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.logging.*;

/**
 * @program: PostGirl-panent
 * @description: 日志工具
 * @author: Cheng Zhi
 * @create: 2022-10-05 10:18
 **/
public class LogUtil {

    private static Logger log;

    public static Logger getLogger(Class clazz) {
        log = Logger.getLogger(clazz.getSimpleName());
        log.setLevel(Level.ALL);
        log.addHandler(customConsoleHandler()); // 使用完成之后需要移出
        String isSaveLog = System.getProperty("isSaveLog");
        if ("true".equalsIgnoreCase(isSaveLog)) {
            log.addHandler(customFileHandler());
        }
        return log;
    }

    /**
     * 自定义控制台打印级别
     * @return
     */
    private static ConsoleHandler customConsoleHandler() {
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(Level.ALL);
        consoleHandler.setFormatter(new CustomFormatter());
        return consoleHandler;
    }

    /**
     * 日志文件保存   todo 路径、文件名、格式建议从配置中读取，暂时先写死
     * @return
     */
    private static FileHandler customFileHandler() {
        FileHandler fileHandler = null;

        try {
            String filePath = "C:\\" + File.separator + "logs";
            String logPath = "logger-cz-20220714.log";
            File fi = new File(filePath);
            if ((fi.exists()) && (fi.isDirectory())) {
                logPath = filePath + File.separator + logPath;
            } else if (!fi.exists()) {
                fi.mkdirs();
                logPath = filePath + File.separator + logPath;
            }
            fileHandler = new FileHandler(logPath, true); // true表示在文件中追加
            fileHandler.setLevel(Level.ALL);
            fileHandler.setFormatter(new CustomFormatter());
            return fileHandler;
        } catch (Exception e) {

        }

        return null;
    }

    /**
     * 自定义日志格式
     */
    public static class CustomFormatter extends Formatter {

        /**
         SimpleDateFormat函数语法：
         G 年代标志符
         y 年
         M 月
         d 日
         h 时 在上午或下午 (1~12)
         H 时 在一天中 (0~23)
         m 分
         s 秒
         S 毫秒
         E 星期
         D 一年中的第几天
         F 一月中第几个星期几
         w 一年中第几个星期
         W 一月中第几个星期
         a 上午 / 下午 标记符
         k 时 在一天中 (1~24)
         K 时 在上午或下午 (0~11)
         z 时区
         */
        private SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a", Locale.CHINA);

        @Override
        public String format(LogRecord record) {
            StringBuilder sb = new StringBuilder();
            String dataFormat = this.sdf.format(Long.valueOf(record.getMillis()));
            sb.append(dataFormat).append(" ");
            sb.append(record.getLoggerName()).append(" ");
            sb.append(record.getSourceClassName()).append(" ");
            sb.append(record.getSourceMethodName()).append(" ");
            sb.append(":");
            sb.append(record.getMessage()).append("\n");

            return sb.toString();
        }
    }

}
